
import org.junit.Test;

import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * 学习Java8中的Optional使用方法
 */
public class OptionalTest {
    /**
     * 三种创建Optional对象方式
     */
    @Test
    public void create() throws Throwable {
        // 创建空的Optional对象
        Optional.empty();
        // 使用非null值创建Optional对象，值为null时会抛出异常 NullPointerException
        Optional.of("Java Optional");
        // 使用任意值创建Optional对象
        Optional optional = Optional.ofNullable("Java8 Optional");
       Optional.ofNullable(null);
        // 判断是否引用缺失（不建议直接使用，因为这样判断和创建一个普通的对象用==null或!=null判断没有什么区别）
        optional.isPresent();

        // 当Optional引用存在时，执行传入的方法
        // 类似的方法： map filter flatMap
        optional.ifPresent(System.out::println);

        // 当Optional引用缺失时执行的方法
        // 当引用缺失时，返回传入的参数
        System.out.println(Optional.empty().orElse("引用缺失"));
        // 当引用缺失时，返回实现Supplier接口的值
        System.out.println(Optional.empty().orElseGet(() -> {
            return "自定义引用缺失";
        }));
        // 当引用缺失时，向外抛出异常
        Optional.empty().orElseThrow(() -> {
            // 返回一个异常对象，orElseThrow方法将这个异常向外抛出
            return new RuntimeException("引用缺失异常");
        });
    }

    public void stream(List<String> list) {
        // 如果list为空，则会抛出空指针异常
//        list.stream().forEach(System.out::println);
        // 使用Optional
        Optional.ofNullable(list)
                .map(List::stream)
                .orElseGet(Stream::empty)
                .forEach(System.out::println);
    }

    @Test
    public void streamTest() {
        stream(null);
    }
}
